package Stream_Study.ShutDownMethod;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

public class StreamDemo10 {
    public static void main(String[] args) {
        /*
            collect(Collector collector)        收集流中的数据，放到集合中(List,Set,Map)

            注意点：
                如果要把数据收集到Map集合当中，则Map的键不能重复
         */

        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list, "雏鹤爱-女-12", "樱岛麻衣-女-16", "小鸟游六花-女-14", "时崎狂三-女-18",
                "四糸乃-女-11", "夜刀神十香-女-19", "张三-男-52", "李四-男-26", "王五-男-27");

        //收集到List集合当中
        //需求:把所有的女性收集起来
        //细节:比较字符串时,一般把固定的数据放到前面调用equals(因为后面的数据有可能是null,会造成空指针异常)
        List<String> newList1 = list.stream().filter(s -> "女".equals(s.split("-")[1]))
                .collect(Collectors.toList());
        System.out.println(newList1);

        System.out.println("------------------------");

        //收集到Set集合当中(可以进行去重)
        //需求:把所有的女性收集起来
        Set<String> newList2 = list.stream().filter(s -> "女".equals(s.split("-")[1]))
                .collect(Collectors.toSet());
        System.out.println(newList2);

        System.out.println("----------------------");

        //收集到Map集合当中
        //谁作为键,谁作为值
        //把所有的女性收集起来
        //键:名字 值:年龄
        //需要指定规则,键的规则和值的规则
        Map<String, Integer> map1 = list.stream().filter(s -> "女".equals(s.split("-")[1]))
                /*
                    toMap: 参数一表示键的生成规则
                           参数二表示值的生成规则
                    参数一：
                        Function泛型一：表示流中每一个数据的类型
                                泛型二：表示Map集合中键的数据类型
                        方法apply形参：依次表示流中的每一个数据
                            方法体：生成键
                            返回值：已经生成的键
                    参数二：
                        Function泛型一：表示流中每一个数据的类型
                                泛型二：表示Map集合中值的数据类型
                        方法apply形参：依次表示流中的每一个数据
                            方法体：生成值
                            返回值：已经生成的值
                 */
                .collect(Collectors.toMap(new Function<String, String>() {
                                              @Override
                                              public String apply(String s) {
                                                  return s.split("-")[0];
                                              }
                                          },
                        new Function<String, Integer>() {
                            @Override
                            public Integer apply(String s) {
                                return Integer.parseInt(s.split("-")[2]);
                            }
                        }));


        Map<String, Integer> map2 = list.stream()
                .filter(s -> "女".equals(s.split("-")[1]))
                .collect(Collectors.toMap(s -> s.split("-")[0],
                        s -> Integer.parseInt(s.split("-")[2])));

        System.out.println(map2);
    }
}
